package pe.com.hermes.hermetic.web.controller.transacciones;

import java.io.InputStream;
import java.io.OutputStream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.apache.log4j.Logger;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ClienteCorpBean;
import pe.com.hermes.hermetic.beans.DenominacionMonedaBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.exception.NiveAutoNotFoundException;
import pe.com.hermes.hermetic.negocio.managerimpl.pedido.tv.PedidoTvContainerManagerImpl;
import pe.com.hermes.hermetic.negocio.managerimpl.pedido.tv.PedidoTvManagerImpl;
import pe.com.hermes.hermetic.negocio.service.ClienteService;
import pe.com.hermes.hermetic.negocio.service.ConfiguracionService;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.PedidoService;
import pe.com.hermes.hermetic.negocio.service.ProgPedidoService;
import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.HMF2014Form;
import pe.com.hermes.unidadesnegocio.general.entities.TipoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoDenoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.ProgPediEntity;

@RequestMapping("/mostrarHWF2014.html")
@Controller
@SessionAttributes(value={"form"})
public class RegistrarPedidoBBController implements IController{
  private Logger logger = Logger.getLogger(this.getClass());
  @Autowired
  private HermeticFacade servicioHermetic;
  @Autowired
  private TablService tablService;
  @Autowired
  private PedidoService pedidoService;
  @Autowired
  private ClienteService clienteService;
  @Autowired
  private ConfiguracionService configuracionService;
  @Autowired
  private ProgPedidoService progPedidoService;
  
  @RequestMapping(method={RequestMethod.GET})
  protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {
    HttpSession session = request.getSession(false);
    List<ClienteCorpBean> listClientes = new ArrayList<ClienteCorpBean>();
    List listaMonedas=new ArrayList();
    String sucursal =(String)session.getAttribute("sucursal");
    String cliente =(String)session.getAttribute("listClie");
    int intTipCliente = (Integer)request.getSession(false).getAttribute("tipClie");  //0=corporacion; 1=banco; 2=cc
    HMF2014Form form = new HMF2014Form();
    form.setCodSucuHtb(sucursal);
    List listaTransacciones = (List)session.getAttribute("listaMenu1");
    List listaBilletes = servicioHermetic.getTipoBilletaje();
    if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.TRANS_REGISTRO_DE_PEDIDOS)) {
        return FORM_ACCESS_NULL_VIEW;
    } 
    //CASO CORPORACION
    if (intTipCliente==ConstantesHermetic.TIPO_CLIE_CORP){
      String codCorp = (Integer)request.getSession(false).getAttribute("codCorp") + "";
      String usuWeb = (String)request.getSession(false).getAttribute("usuario");
      int codSucuHtb = Integer.parseInt(sucursal);
      if (codSucuHtb == 1) codSucuHtb =0;
      listClientes = clienteService.getListClieByCorp(Integer.parseInt(codCorp), usuWeb, "");
      if (listClientes.size() > 0){
        ClienteCorpBean objCliente = listClientes.get(0);
        form.setDesClie(objCliente.getDesRazoSoci());
        form.setCodClie(objCliente.getListCodCliente());
      }
    }else{
        form.setCodClie(cliente);
    }
    form.setListCodClie(form.getCodClie());
    form.setTipProc(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL);
    AuditBean auditBean = new AuditBean(REGI_PEDI_TVBB);
    servicioHermetic.inseAudit(auditBean);
    String codOpci = IWebOpciones.REGI_PEDI_TVBB;
    String desOpci = servicioHermetic.getDesOpci(codOpci, request);
    //pasa una lista de clie
    int parmConf = progPedidoService.getExisParmProg(Integer.parseInt(form.getCodClie().split(",")[0]), Integer.parseInt(sucursal));
    List listBancos = clienteService.getListBancPediByClie(form.getCodClie(), "");
    form.setListBancos(listBancos);
    model.put("parmConf", parmConf);
    model.put("codOpci",codOpci);
    model.put("desOpci",desOpci);
    request.getSession(false).removeAttribute("listadoPedidosGuardados");
    model.put("listaMonedas",listaMonedas);
    model.put("listaBilletes",listaBilletes);
    model.put("listClientes",listClientes);
    model.put(FORM_KEY,form);
    return FORM_REG_PEDI_TVBB_VIEW;
  }
  
  @RequestMapping(params="accion=mostrarExcel")
  protected void mostrarExcel(HttpServletRequest request,@ModelAttribute(FORM_KEY) HMF2014Form form,HttpServletResponse response)throws Exception{
      try{
          PedidoTvContainerManagerImpl pedidoContainer = (PedidoTvContainerManagerImpl)request.getSession(false).getAttribute("listadoPedidos");
          int tipClie = (Integer)request.getSession(false).getAttribute("tipClie");
          String desCorp = "";
          String desClie = "";
          String fecSoli = Util.getFechaActual();
          if (tipClie == ConstantesHermetic.TIPO_CLIE_CORP){
            desCorp = (String)request.getSession(false).getAttribute("desCorp");
            desClie = form.getDesClie(); //combo
          }
          else{
            desClie = (String)request.getSession(false).getAttribute("desRazoSoci");
          }
          String pathLogo = request.getSession().getServletContext().getRealPath("/images/logo.png");
          Map parameters = new HashMap();
          parameters.put("lst_data", pedidoContainer);
          parameters.put("tip_clie", tipClie);
          parameters.put("des_corp", desCorp);
          parameters.put("des_clie", desClie);
          parameters.put("fec_soli", fecSoli);
          parameters.put("logo_cabecera",pathLogo);
          HSSFWorkbook wb = new HSSFWorkbook(); 
          
          wb=pedidoService.excelRegistrarPedidoCome(parameters);
          response.addHeader("Content-type", "application/vnd.ms-excel");
          response.addHeader("Content-Disposition", "attachment; filename=vistaPreliminarPedidos.xls");
          response.setContentType("Content-type: application/vnd.ms-excel");
          
          response.setHeader("Cache-Control","cache"); // HTTP 1.1
          response.setHeader("Pragma","cache"); // HTTP 1.0
          response.setDateHeader ("Expires", -1);  
          
          OutputStream out = response.getOutputStream();
          wb.write(out);
          out.close();
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
      }    
  }
  
  @RequestMapping(params="accion=mostrarExcelSustento")
  protected void mostrarExcelSustento(HttpServletRequest request,@ModelAttribute(FORM_KEY) HMF2014Form form,HttpServletResponse response)throws Exception{
      try{
          List<PedidoTvManagerImpl> pedidosBean = (List)request.getSession(false).getAttribute("listadoPedidosGuardados");
          PedidoTvContainerManagerImpl pedidoContainer = new PedidoTvContainerManagerImpl();
          pedidoContainer.setPedidos(pedidosBean);
          int tipClie = (Integer)request.getSession(false).getAttribute("tipClie");
          String desCorp = "";
          String desClie = "";

          if (tipClie == ConstantesHermetic.TIPO_CLIE_CORP){
            desCorp = (String)request.getSession(false).getAttribute("desCorp");
            desClie = form.getDesClie(); //combo
          }
          else{
            desClie = (String)request.getSession(false).getAttribute("desRazoSoci");
          }
          String fecSoliPedi = "";
          String horSoliPedi = "";
          String tipPedi = "";
          StringBuffer nomUsua = new StringBuffer();
          nomUsua.append(Util.getUser().getPriNomb()).append(" ");
          nomUsua.append(Util.getUser().getSegNomb()).append(" ");
          nomUsua.append(Util.getUser().getPriApel()).append(" ");
          nomUsua.append(Util.getUser().getSegApel());
          Map <Integer, Integer> mapMaxNive = new HashMap<Integer, Integer>();
          Map <Integer, Integer> mapUsuNive = new HashMap<Integer, Integer>();
          for(PedidoEntity pedidoBean : pedidosBean){
              fecSoliPedi = pedidoBean.getFecSoliPedi();
              horSoliPedi = pedidoBean.getHorSoliPedi();
              tipPedi = pedidoBean.getTipPedi().getCodTipo();
              if (mapMaxNive.get(pedidoBean.getClieOrig().getCodClie()) == null){
                mapMaxNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNumNiveAuto(pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                try{
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNiveAutoByUsua(Util.getUser().getUsuWeb(), pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                }catch(Exception e){
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), 0);
                }
              }
          }
          
          String fecha_srv = servicioHermetic.getFechaHoy();
          String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
          String pathLogo = request.getSession().getServletContext().getRealPath("/images/logo.png");
          Map parameters = new HashMap();
          parameters.put("titulo", "Sustento del Registro de Pedido");
          parameters.put("lst_data", pedidoContainer);
          parameters.put("tip_clie", tipClie);
          parameters.put("origen_repo", "RBB");
          parameters.put("mapMax", mapMaxNive);
          parameters.put("mapUsu", mapUsuNive);
          parameters.put("des_corp", desCorp);
          parameters.put("des_clie", desClie);
          parameters.put("fec_soli", fecSoliPedi);
          parameters.put("hor_soli", horSoliPedi);
          parameters.put("usuWeb",Util.getUser().getUsuWeb());
          parameters.put("nomUsua",nomUsua.toString());
          parameters.put("tipPedi", servicioHermetic.getDescripcion(ConstantesHermetic.TIPO_PEDIDO+"", tipPedi));
          parameters.put("fecha_srv",fecha_srv);
          parameters.put("hora_srv",hora_srv);
          parameters.put("logo_cabecera",pathLogo);
          
          HSSFWorkbook wb = new HSSFWorkbook(); 
          
          wb=pedidoService.excelSustentoPedidoCome(parameters);
          response.addHeader("Content-type", "application/vnd.ms-excel");
          response.addHeader("Content-Disposition", "attachment; filename=sustentoExcelPedidos.xls");
          response.setContentType("Content-type: application/vnd.ms-excel");
          
          response.setHeader("Cache-Control","cache"); // HTTP 1.1
          response.setHeader("Pragma","cache"); // HTTP 1.0
          response.setDateHeader ("Expires", -1);  
          
          OutputStream out = response.getOutputStream();
          wb.write(out);
          out.close();
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
      }    
  }
  
  @RequestMapping(params="accion=verPDF")
  protected void verPDF(HttpServletRequest request,@ModelAttribute(FORM_KEY) HMF2014Form form, HttpServletResponse response)throws Exception{
      try{
          HttpSession session = request.getSession(false);
          String rutaJasper = session.getServletContext().getInitParameter("rutajasper");
          StringBuffer jasperPath = new StringBuffer(rutaJasper).append("/").append("HMR2014").append(".jasper");
          int intTipCliente = (Integer)request.getSession(false).getAttribute("tipClie");  //0=corporacion; 1=banco; 2=cc
          Map map = new HashMap();
          JRDataSource simpleDS;
          String fecha_srv = servicioHermetic.getFechaHoy();
          String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
          String fecSoliPedi = null;
          String horSoliPedi = null;
          String tipPedi = null;
          List<PedidoTvManagerImpl> pedidosBean = (List)request.getSession(false).getAttribute("listadoPedidosGuardados");
          PedidoTvContainerManagerImpl pedidoContainer = new PedidoTvContainerManagerImpl();
          Collections.sort(pedidosBean);
          pedidoContainer.setPedidos(pedidosBean);
          simpleDS = new JRBeanCollectionDataSource(pedidosBean);
          Map <Integer, Integer> mapMaxNive = new HashMap<Integer, Integer>();
          Map <Integer, Integer> mapUsuNive = new HashMap<Integer, Integer>();
          for(PedidoEntity pedidoBean : pedidosBean){
              fecSoliPedi = pedidoBean.getFecSoliPedi();
              horSoliPedi = pedidoBean.getHorSoliPedi();
              tipPedi = pedidoBean.getTipPedi().getCodTipo();
              if (mapMaxNive.get(pedidoBean.getClieOrig().getCodClie()) == null){
                mapMaxNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNumNiveAuto(pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                try{
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNiveAutoByUsua(Util.getUser().getUsuWeb(), pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                }catch(Exception e){
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), 0);
                }
              }
          }
          pedidoContainer.setTipClieProc(intTipCliente);
          Map subReportDS1 = pedidoService.getRepoBovBancDS(pedidoContainer);
          StringBuffer nomUsua = new StringBuffer();
          nomUsua.append(Util.getUser().getPriNomb()).append(" ");
          nomUsua.append(Util.getUser().getSegNomb()).append(" ");
          nomUsua.append(Util.getUser().getPriApel()).append(" ");
          nomUsua.append(Util.getUser().getSegApel());
          if (intTipCliente == ConstantesHermetic.TIPO_CLIE_CORP){
            map.put("nomCorp",(String)session.getAttribute("desCorp"));
            map.put("nomClie",form.getDesClie());
          }else{
            map.put("nomCorp","");
            map.put("nomClie",(String)session.getAttribute("desRazoSoci"));
          }
          map.put("titulo", "SUSTENTO DEL REGISTRO DE PEDIDO");
          map.put("mapMax", mapMaxNive);
          map.put("mapUsu", mapUsuNive);
          map.put("usuWeb",Util.getUser().getUsuWeb());
          map.put("nomUsua",nomUsua.toString());
          map.put("tipPedi", servicioHermetic.getDescripcion(ConstantesHermetic.TIPO_PEDIDO+"", tipPedi));
          map.put("fec_soli_pedi", fecSoliPedi);
          map.put("hor_soli_pedi",horSoliPedi);
          map.put("fec_srv",fecha_srv);
          map.put("hor_srv",hora_srv);
          map.put("subReportDS1",subReportDS1);
          map.put("contextPath",request.getSession().getServletContext().getRealPath("/"));
          ServletOutputStream servletOutputStream = response.getOutputStream();
          InputStream reportStream = session.getServletContext().getResourceAsStream(jasperPath.toString());
          byte[] bytes = null;        
          bytes = JasperRunManager.runReportToPdf(reportStream, map, simpleDS);
          response.setHeader("Cache-Control","cache"); // HTTP 1.1
          response.setHeader("Pragma","cache"); // HTTP 1.0
          response.setDateHeader ("Expires", -1);         
          response.setContentType("application/pdf");
          response.addHeader("Content-Disposition", "inline; filename=Reporte.pdf");        
          response.setContentLength(bytes.length);         
          servletOutputStream.write(bytes, 0, bytes.length);
          servletOutputStream.flush();
          servletOutputStream.close();
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
      }    
  }
  
  @RequestMapping(params={"accion=configProg"})
  protected String mostrarConfigProg(ModelMap model, HttpServletRequest request)throws Exception{
      ProgPediEntity objProg = (ProgPediEntity)request.getSession(false).getAttribute("programacion");
      if (objProg == null) objProg = new ProgPediEntity();
      model.put("programacion",objProg);
      return FORM_CONF_PROG_PEDI;
  }
}
